package cn.juque.singleton.doublechecklock;

/**
 * @author juque
 * @version 1.0.0
 * <ul>
 *     <li>双重校验锁</li>
 * </ul>
 * @date 2023-06-13 09:29:32
 **/
public class Singleton {

    /**
     * volatile关键字适用于修饰基础类型，如果修饰对象，
     * 对象内部属性也要适用volatile修饰，否则volatile可见性不会生效。
     * 双重校验锁机制适用volatile是为了避免代码重排，所以不存在该问题
     */
    private volatile static Singleton instance;

    private Singleton() {
    }

    public Singleton getInstance(){
        if(null != instance) {
            return instance;
        }
        synchronized (Singleton.class) {
            if(null == instance) {
                instance = new Singleton();
            }
        }
        return instance;
    }
}
